// 65. 有效数字/困难/transform/strtod
// 有效数字（按顺序）可以分成以下几个部分：
// 一个 小数 或者 整数（可选）一个 'e' 或 'E' ，后面跟着一个 整数
// 小数（按顺序）可以分成以下几个部分：
// （可选）一个符号字符（'+' 或 '-'）
// 下述格式之一：
// 至少一位数字，后面跟着一个点 '.'
// 至少一位数字，后面跟着一个点 '.' ，后面再跟着至少一位数字
// 一个点 '.' ，后面跟着至少一位数字
// 整数（按顺序）可以分成以下几个部分：
// （可选）一个符号字符（'+' 或 '-'）
// 至少一位数字

// 列举：["2", "0089", "-0.1", "+3.14", "4.", "-.9",
// "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
#include <bits/stdc++.h>
using namespace std;
bool isNumber(string s) {
  transform(s.begin(), s.end(), s.begin(), ::tolower);
  char *ptr = NULL;
  double num = strtod(s.c_str(), &ptr);
  return (ptr && *ptr == 0 && s.find("inf")==-1);
}

int main() {
    vector<string> ss = {"2", "inf", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"};;
    for (auto s : ss) {
        isNumber(s);
    }

}
